Ext.onReady(function() {
	if (username == null)
		return;
	Ext.QuickTips.init();
	function pageLoad() {
		Ext.define('ApplicationModel', {
					extend : 'Ext.data.Model',
					fields : [{
								name : 'appId'
							}, {
								name : 'appName'
							}, {
								name : 'appHasReport'
							}, {
								name : 'appCreateTime'
							}, {
								name : 'userId'
							}, {
								name : 'userName'
							}]
				});
		Ext.define('ModuleModel', {
					extend : 'Ext.data.Model',
					fields : [{
								name : 'modId'
							}, {
								name : 'modName'
							}, {
								name : 'modCreateTime'
							}, {
								name : 'modFileUrl'
							}, {
								name : 'appId'
							}]
				});
		Ext.define('RuleSetModel', {
					extend : 'Ext.data.Model',
					fields : [{
								name : 'rusId'
							}, {
								name : 'rusName'
							}, {
								name : 'userId'
							}, {
								name : 'rusDescription'
							}, {
								name : 'rusVersion'
							}, {
								name : 'rusPublic'
							}, {
								name : 'rusCreateTime'
							}, {
								name : 'reportWithRulesets'
							}, {
								name : 'rulesetWithRules'
							}]
				});
		Ext.define('ReportModel', {
					extend : 'Ext.data.Model',
					fields : [{
								name : 'repId'
							}, {
								name : 'rusId'
							}, {
								name : 'repName'
							}, {
								name : 'repType'
							}, {
								name : 'appId'
							}, {
								name : 'repLines'
							}, {
								name : 'repAlerts'
							}, {
								name : 'repEffort'
							}, {
								name : 'repTeamAdjustment'
							}, {
								name : 'repTestFactor'
							}, {
								name : 'repAdjustedEffort'
							}, {
								name : 'teamId'
							}, {
								name : 'testId'
							}, {
								name : 'repCreateTime'
							}, {
								name : 'repFileUrl'
							}]
				});

		var ModuleStore = Ext.create('Ext.data.Store', {
					autoload : true,
					pageSize : pSize,
					model : 'ModuleModel',
					proxy : {
						type : 'ajax',
						// list module by applicatoinId
						url : 'module_moduleList.action',
						method : 'POST',
						reader : {
							idProperty : 'modId',
							root : 'result.list',
							totalProperty : 'total'
						},
						simpleSortMode : true
					}
				});
		var ApplicationStore = Ext.create('Ext.data.Store', {
					autoload : true,
					pageSize : pSize,
					model : 'ApplicationModel',
					remoteSort : true,
					proxy : {
						type : 'ajax',
						url : 'application_applicationList.action',
						method : 'POST',
						reader : {
							idProperty : 'appId',
							root : 'result.list',
							totalProperty : 'total'
						},
						simpleSortMode : true
					}
				});
		var RuleSetStore = Ext.create('Ext.data.Store', {
					//
					// autoload : true,
					pageSize : pSize,
					model : 'RuleSetModel',
					proxy : {
						type : 'ajax',
						url : 'ruleset_ruleSetList.action',
						method : 'POST',
						reader : {
							idProperty : 'rusId',
							root : 'result.list',
							totalProperty : 'total'
						},
						simpleSortMode : true
					}
				});
		var ReportStore = Ext.create('Ext.data.Store', {
					autoload : true,
					pageSize : pSize,
					model : 'ReportModel',
					remoteSort : true,
					remoteFilter : true,
					proxy : {
						type : 'ajax',
						url : 'report_reportList.action',
						method : 'POST',
						reader : {
							idProperty : 'repId',
							root : 'result.list',
							totalProperty : 'total'
						},
						simpleSortMode : true
					}
				});

		var ApplicationGrid = Ext.create('Ext.grid.Panel', {
			itemId : 'ApplicationGrid',
			store : ApplicationStore,

			columnLines : true,
			autoHeight : true,
			autoWidth : true,
			title : '应用列表',
			frame : true,
			loadMask : true,

			viewConfig : {
				stripeRows : true
			},
			columns : [{
						text : "应用名称",
						flex : .5,
						dataIndex : 'appName',
						sortable : true
					}, {
						text : "报告Id",
						flex : .5,
						dataIndex : 'repId',
						sortable : true,
						hidden : true
					}, {
						text : "创建者",
						flex : .2,
						dataIndex : 'userName',
						sortable : true,
						
//						renderer : function(value, meta, record) {
//							return record.raw.userName;
//						}
					}, {
						text : "创建时间",
						flex : 1,
						dataIndex : 'appCreateTime',
						sortable : true,
					}, {
						menuDisabled : true,
						flex : .3,
						sortable : false,
						xtype : 'actioncolumn',
						items : [{
									iconCls : 'icon-report',
									tooltip : '查看报告列表',
									margin : '0 0 0 10',
									// attr : 'style="margin-left:100"',
									handler : function(grid, rowIndex, colIndex) {
										var rec = grid.store.getAt(rowIndex);
										showReportWindow(rec);
									}
								}, {
									iconCls : 'icon-edit',
									tooltip : '查看模块列表',
									margin : '0 0 0 10',
									text : '模块列表',
									handler : function(grid, rowIndex, colIndex) {
										var rec = grid.store.getAt(rowIndex);
										showModuleWindow(rec);
									}
								}, {
									iconCls : 'icon-delete',
									tooltip : '删除',
									text : '删除',
									handler : function(grid, rowIndex, colIndex) {
										Ext.MessageBox.confirm('提示',
												'您确定要删除所选吗?', function(btnId) {
													if (btnId == 'yes') {

														var rec = grid.store
																.getAt(rowIndex);
														var msgTip = Ext.MessageBox
																.show({
																	title : '提示',
																	width : 250,
																	msg : '正在删除请稍候...'
																});
														Ext.Ajax.request({
															url : 'application_deleteApplication.action',
															params : {
																appName : rec
																		.get('appName'),
																appId : rec
																		.get('appId')
															},
															method : 'POST',
															success : function(
																	response) {
																msgTip.hide();
																var result = Ext.JSON
																		.decode(response.responseText);
																if (result.success) {
																	grid.store
																			.remove(rec);
																	Ext.Msg
																			.alert(
																					'提示',
																					'删除成功!');
																} else {
																	Ext.Msg
																			.alert(
																					'提示',
																					'删除失败!');
																}
															},
															failure : function(
																	response) {
																Ext.Msg
																		.alert(
																				'提示',
																				'删除失败!');
															}
														});
													}
												});
									}
								}]
					}],// end columns
			features : [{
						ftype : 'filters',
						encode : true,
						local : false,
						filters : [{
									type : 'string',
									dataIndex : 'appName',
									disabled : false
								}, {
									type : 'string',
									dataIndex : 'userId',
									disabled : false
								}

						]
					}],
			dockedItems : [{
						dock : 'top',
						xtype : 'toolbar',
						items : [{
									itemId : 'addAppButton',
									text : '创建应用',
									tooltip : '创建应用',
									iconCls : 'icon-add',
									scope : this,
									handler : function() {
										var rec = null;
										showAddWindow();
									}
								}, '-', {
									itemId : 'genReportButton',
									text : '生成报告',
									tooltip : '生成报告',
									iconCls : 'icon-add',
									scope : this,
									handler : function(btn, e, opt) {
										grid = btn.up('grid');
										rec = grid.getSelectionModel()
												.getSelection();
										showGenWindow(rec[0]);
									}
								}, '-', '显示记录数', {
									itemId : 'AppCmbNum',
									name : 'AppCmbNum',
									xtype : 'combo',
									width : 50,
									allowBlank : false,
									blankText : '必须选择页面大小!',
									store : pageStore,
									value : pSize,
									editable : false,
									loadingText : '正在加载...',
									displayField : 'name',
									valueField : 'abbr',
									emptyText : '请选择页面大小',
									queryMode : 'local',
									listeners : {
										select : function(combo, record, index) {
											pSize = this.getValue();
											ApplicationStore.pageSize = pSize;
											ApplicationStore.load();
										}
									}
								},
//									{
//									itemId : 'debugButton',
//									text : 'debug',
//									name : 'debug',
//									tooltip : 'DEBUG',
//									iconCls : 'icon-add',
//									scope : this,
//									handler : function(btn, e, opt) {
//										Ext.Ajax.request({
//											url : 'application_debug.action',
//											params : {
//											},
//											method : 'POST',
//										});
//									}
//								}
								
								]
					}, Ext.create('Ext.PagingToolbar', {
								pageSize : pSize,
								dock : 'bottom',
								store : ApplicationStore,
								displayInfo : true,
								displayMsg : '显示 {0} - {1} 条，共计 {2} 条',
								emptyMsg : '没有数据',
								plugins : Ext.create('Ext.ux.ProgressBarPager',
										{})
							})],// end docked items
			listeners : {
				beforerender : function(grid, opts) {
					ApplicationStore.pageSize = 15;
					ApplicationStore.load();
				},
//				afterrender : function(grid, opts){
//					pageLoading = 0;
//				}
			}

		});// end ReportGrid

		// TODO addApplication
		function showAddWindow() {
			console.log('#showAddWindow');
			var applicationForm = Ext.create('Ext.form.Panel', {
				frame : true,
				bodyStyle : 'padding:5px 5px 0',
				autoWidth : true,
				fieldDefaults : {
					msgTarget : 'side',
					labelWidth : 75
				},
				defaultType : 'textfield',
				defaults : {
					anchor : '100%'
				},
				items : [{
							xtype : 'textfield',
							itemId : 'id',
							name : 'id',
							columnWidth : 0.5,
							hidden : true
						}, {
							xtype : 'textfield',
							itemId : 'applicationname',
							name : 'appName',
							columnWidth : 0.5,
							fieldLabel : '应用名<span style="color:red;">*</span>',
							allowBlank : false,
							readonly : true
						}, {
							xtype : 'fileuploadfield',
							id : 'appFile',
							emptyText : '请选择文件（.war .jar）',
							fieldLabel : '文件<span style="color:red;">*</span>',
							allowBlank : false,
							name : 'upload',
							buttonCfg : {
								text : '',
								iconCls : 'icon-upload'
							},
							// FIXME: validator doesn't work
							validator : function(value) {
								console.log(value);
								var types = ['war', 'jar', 'zip'];
								var arr = value.split('.');
								if (types.indexOf(arr[arr.length - 1]) == -1) {
									return '文件类型不合法';
								} else {
									return true;
								}
							}
						}],
				buttons : [{
							text : '确定',
							handler : submitForm
						}, {
							text : '取消',
							handler : function() {
								applicationForm.destroy();
								applicationWindow.destroy();
							}
						}]

			});
			function submitForm() {
				values = applicationForm.form.getValues();
				var JSONobj = [];
				// JSONobj.push(values);
				JSONobj.push(JSON.stringify(values));

				var userName = JSON.stringify(username);
				///////
				var appName = JSON.stringify(applicationForm.down("#applicationname").getValue());
				console.log(appName);
				applicationForm.form.submit({
							clientValidation : true,
							waitMsg : '正在上传请稍后',
							waitTitle : '提示',
							url : 'fileupload_addApplication.action',
							method : 'post',
							params : {
								datas : JSONobj,
								userName : userName,
								appName : appName
							},
							success : function(form, action) {
								Ext.Msg.alert('提示', '文件:'
												+ action.result.uploadFileName
												+ '已经成功上传');
								// showModuleWindow();
								applicationForm.destroy();
								applicationWindow.destroy();
								ApplicationStore.load();
							},
							failure : function(form, action) {
								console.log(action);
								var errorMsg = action.result.errorMsg;
								if (errorMsg == null || errorMsg.length < 1) {
									errorMsg = '上传失败，请检查文件';
								}
								console.log(errorMsg);
								Ext.MessageBox.show({
											title : '错误',
											msg : errorMsg,
											buttons : Ext.MessageBox.OK,
											icon : Ext.MessageBox.ERROR
										});
								applicationForm.destroy();
								applicationWindow.destroy();
							}
						});
			}

			var applicationWindow = new Ext.Window({
						title : '新建应用',
						layout : 'fit',
						width : 380,
						closeAction : 'hide',
						height : 200,
						resizable : false,
						shadow : true,
						modal : true,
						closable : true,
						bodyStyle : 'padding:5 5 5 5',
						animCollapse : true,
						items : [applicationForm]
					});
			applicationWindow.doLayout();
			applicationWindow.show();
			console.log('debug');
		};

		function showModuleWindow(rec) {
			var applicationId = JSON.stringify(rec.data['appId']);
			var moduleGrid = Ext.create('Ext.grid.Panel', {
				itemId : 'ModuleGrid',
				store : ModuleStore,
				columnLines : true,
				autoHeight : true,
				autoWidth : true,
				frame : true,
				loadMask : true,
				viewConfig : {
					stripeRows : true
				},
				columns : [{
							header : '模块名',
							dataIndex : 'modName',
							flex : 1
						}, {
							header : '模块ID',
							dataIndex : 'modId',
							flex : 1,
							hidden : true
						}, {
							header : 'URL',
							dataIndex : 'modFileUrl',
							flex : 1
						}, {
							header : '操作',
							menuDisabled : true,
							sortable : false,
							xtype : 'actioncolumn',
							align : 'center',
							flex : .6,
							items : [{
										text : '重命名',
										iconCls : 'icon-edit',
										tooltip : '重命名'
									}, {
										text : '删除',
										iconCls : 'icon-delete',
										tooltip : '删除',
										handler : function(grid, rowIndex,colIndex) {
											var rec = grid.store.getAt(rowIndex);
											var modId = JSON.stringify(rec.data['modId']);
											console.log(modId);
											Ext.MessageBox.confirm('提示',
													'您确定要删除 '+rec.data['modName']+' 吗?', function(
															btnId) {
														if (btnId == 'yes') {
															var rec = grid.store.getAt(rowIndex);
															var msgTip = Ext.MessageBox
																	.show({
																		title : '提示',
																		width : 250,
																		msg : '正在删除请稍候...'
																	});
															Ext.Ajax.request({
																url : 'module_deleteModule.action',
																params : {
																	modId : modId
																},
																method : 'POST',
																success : function(response) {
																	msgTip.hide();
																	var result = Ext.JSON.decode(response.responseText);
																	if (result.success) {
																		grid.store.remove(rec);
																		Ext.Msg.alert(
																						'提示',
																						'删除成功!');
																	} else {
																		Ext.Msg
																				.alert(
																						'提示',
																						'删除失败!');
																	}
																},
																failure : function(
																		response) {
																	Ext.Msg
																			.alert(
																					'提示',
																					'删除失败!');
																}
															});
														}
													});
										}
									}]
						}],
				listeners : {
					beforerender : function(grid, appplicationId) {
						ModuleStore.load({
									params : {
										appId : applicationId
									}
								});
					}
				}
			});
			var moduleWindow = new Ext.Window({
						title : '模块列表-' + rec.data['appName'],
						layout : 'fit',
						width : 550,
						closeAction : 'destroy',
						height : 500,
						resizable : false,
						autoScroll : true,
						shadow : true,
						modal : true,
						closable : true,
						bodyStyle : 'padding:5 5 5 5',
						animCollapse : true,
						items : [moduleGrid]
					});
			moduleWindow.show();
		};
		function showGenWindow(rec) {
			console.log(rec);
			if (rec == null || rec.length < 1) {
				Ext.Msg.alert('提示', '请选择要扫描的应用');
				return;
			}
			console.log(rec.data['appId']);

			var reportGenForm = Ext.create('Ext.form.Panel', {
				frame : true,
				bodyPadding : 5,
//				renderTo: 'multiselect',
				width : '100%',
				fieldDefaults : {
					labelAlign : 'left',
					msgTarget : 'side'
				},
				items : [{
							xtype : 'container',
							anchor : '100%',
							layout : 'hbox',
							items : [{
										xtype : 'container',
										flex : 1,
										layout : 'anchor',
										items : [{
											xtype : 'textfield',
											fieldLabel : '报告名称',
											allowBlank : false,
											name : 'repName',
											anchor : '95%',
											maxLength : 255,
											maxLengthText : '报告名最多255位'
												// regex :
												// /^[A-Za-z0-9\u4e00-\u9fa5]+$/,
												// regexText :
												// "报告名仅能由汉字,英文字母,数字组成"
											}]
									}]
						}, {
							anchor : '95%',
							xtype : 'multiselect',
							msgTarget : 'side',
							fieldLabel : '规则集',
							itemId : 'rulesets',
							name : 'rulesets',
							id : 'multiselect-field',
							allowBlank : false,
							store : RuleSetStore,
							valueField : 'rusId',
							displayField : 'rusName',
							// value : ['3', '4', '6'],
							ddReorder : true
						},
				// {
				// xytpe : 'hiddenfield',
				// name : 'appId',
				// itemId : 'appId',
				// value : rec.data['appId']
				// }
				],
				buttons : [{
					text : '确定',
					handler : function(btn, e, opt) {
						var form = btn.up('form').getForm();
						if (!form.isValid()) {
							Ext.Msg.alert('提示', '必填项不能为空');
							return;
						}

						values = form.getValues();
						var JSONobj = [];
						JSONobj.push(JSON.stringify(values));

						var userName = [];
						userName.push(JSON.stringify(username));

						var appId = JSON.stringify(rec.data['appId']);
						console.log(JSONobj);
						form.submit({
									clientValidation : true,
									waitMsg : '分析中请稍后...',
									waitTitle : '提示',
									url : 'report_generateReport.action',
									method : 'post',
									params : {
										datas : JSONobj,
										userName : userName,
										appId : appId
									},
									success : function(form, action) {
										Ext.Msg.alert('提示', '生成分析报告成功');
										// showModuleWindow();
										reportGenForm.destroy();
										reportGenWindow.destroy();
									},
									failure : function(form, action) {
										// var errorMsg =
										// action.result.errorMsg;
										var errorMsg = '分析失败！';
										Ext.MessageBox.show({
													title : '错误',
													msg : errorMsg,
													buttons : Ext.MessageBox.OK,
													icon : Ext.MessageBox.ERROR
												});
										reportGenForm.destroy();
										reportGenWindow.destroy();
									}
								});

					}
				}, {
					text : '取消',
					handler : function() {
						reportGenForm.destroy();
						reportGenWindow.destroy();
					}
				}]
			});

			var reportGenWindow = new Ext.Window({
						title : '生成报告-' + rec.data['appName'],
						requires : ['Ext.ux.form.ItemSelector'],
						layout : 'fit',
						width : 450,
						// 设置为destroy防止RuleSetStore重复加载
						closeAction : 'destroy',
						height : 500,
						resizable : false,
						autoScroll : true,
						shadow : true,
						modal : true,
						closable : true,
						bodyStyle : 'padding:5 5 5 5',
						animCollapse : true,
						items : [reportGenForm]
					});

			reportGenWindow.on('afterrender', function() {
						console.log('reportGenWindow:afterrender');
						reportGenWindow.down('#rulesets').getStore().load();
					});
			reportGenWindow.show();
		};
		function showReportWindow(rec) {
			var applicationId = JSON.stringify(rec.data['appId']);
			var reportGrid = Ext.create('Ext.grid.Panel', {
						itemId : 'ReportGrid',
						store : ReportStore,
						columnLines : true,
						autoHeight : true,
						autoWidth : true,
						frame : true,
						loadMask : true,
						viewConfig : {
							stripeRows : true
						},
						columns : [{
									header : '报告名称',
									dataIndex : 'repName',
									flex : 1
								}, {
									header : '报告ID',
									dataIndex : 'repId',
									flex : 1,
									hidden : true
								}, {
									header : 'URL',
									dataIndex : 'repFileUrl',
									flex : 1
								}, {
									header : '创建时间',
									dataIndex : 'repCreateTime',
									flex : 1,
//						renderer : Ext.util.Format.dateRenderer('n/j/Y g:i A'),
								}, {
									header : '操作',
									menuDisabled : true,
									sortable : false,
									xtype : 'actioncolumn',
									align : 'center',
									flex : .6,
									items : [{
												text : '下载',
												iconCls : 'icon-downArrow',
												tooltip : '重命名'
											}, {
												text : '删除',
												iconCls : 'icon-delete',
												tooltip : '删除'
											}]
								}],
						listeners : {
							beforerender : function(grid, appplicationId) {
								ReportStore.load({
											params : {
												appId : applicationId
											}
										});
							}
						}
					});
			var reportWindow = new Ext.Window({
						title : '报告列表-' + rec.data['appName'],
						layout : 'fit',
						width : 550,
						closeAction : 'destroy',
						height : 500,
						resizable : false,
						autoScroll : true,
						shadow : true,
						modal : true,
						closable : true,
						bodyStyle : 'padding:5 5 5 5',
						animCollapse : true,
						items : [reportGrid]
					});
			reportWindow.show();
		};

		var tab = Ext.getCmp('mainContent').getActiveTab();
		tab.items.add(ApplicationGrid);
		tab.doLayout();
	}
	pageLoad();
});